package IA.Bicing;

import java.util.ArrayList;

import aima.search.framework.HeuristicFunction;

public class bicingHeuristicFunction implements HeuristicFunction{
	
	private int minim (int bicisPortades, int necesari) {
		if (bicisPortades < necesari) return bicisPortades;
		return necesari;
	}
	
	private int max(int a,int b){
		if(a < b)	return b;
		return a;
	}
	
	@SuppressWarnings("unchecked")
	public double getHeuristicValue(Object state) {
		bicingMapBoard estat =(bicingMapBoard)state; //casting de Object -> bicingMapBoard			
		Bicing bicing = estat.getBicing();
		   	   
		   ArrayList <Integer> bicisPortades = new ArrayList <Integer>();
		   bicisPortades = (ArrayList<Integer>) estat.bicisPortades().clone(); // vector bicis portades a cada estacio		   
		   ArrayList <Integer> bicisAgafades = new ArrayList <Integer>(); 
		   bicisAgafades = (ArrayList<Integer>) estat.bicisAgafades().clone(); // vector bicis agafades de cada estacio
		   int bicisNecesit = 0;
		   int guanysTotals = 0;
		   int guanyParcial = 0;
		   
		  
		   /* calculem els guanys totals deguts al nombre de bicis deixades i agafades*/
		   int sobren = 0;
		   int perdues = 0;
		   ArrayList <Integer> guanys  = new ArrayList<Integer>(); 	 
		   for (int k = 0; k < bicisAgafades.size(); k++) {
			   guanyParcial = bicisPortades.get(k) - bicisAgafades.get(k);
			   if (guanyParcial != 0) {
				   bicisNecesit = bicing.getDemandNextHour(k) - bicing.getStationNextState(k);	
				   if(guanyParcial > 0){
					   if(bicisNecesit > 0){
						   guanys.add(minim(bicisNecesit,guanyParcial));
					   } else { //realment no cal fer-lo, perque suma zero...
						   guanys.add(0);
					   }					   
				   }		

				   else {
					   sobren = bicing.getStationNextState(k) - bicing.getDemandNextHour(k);
					   perdues = -guanyParcial - sobren;
					   if (perdues > 0) guanys.add(-perdues); //si realment hi ha perdues, les restem als guanys totals
				   }
	 
			   }
		   }
		   
		   /* sumem tot, i treiem el balan� net de guanys */	   
		   for (int j = 0; j < guanys.size(); j++) guanysTotals -= guanys.get(j);
		   
		   return guanysTotals;
	}
}